/*************************************************************************
        > File Name: opitem.h
        > Author: xuwenlong
        > Mail: myxuan475@126.com
        > Created Time: 2018年02月23日 星期五 15时01分34秒
 ************************************************************************/
#ifndef LIBXCOM_OPITEM_H
#define LIBXCOM_OPITEM_H

#include "cmdvalue.h"
#include "data.h"
#include "operator.h"
#include "opvalue.h"
#include <memory>
#include <queue>
#include <stack>
#include <stdio.h>
#include <string>
#include <utils/logger.h>
#include <vector>

#define MAX_VAR_LEN 20

namespace libxcom {

typedef enum {
    OP_NONE = 0,
    OP_NUM,
    OP_BASE, // 基本运算符，+-×/,&,^ 运算符
    OP_VAR,
    OP_FUNC,
    OP_KEYFUNC, // 关键函数,ditch,fill
    OP_BRACE,
    OP_BRACKET,   /* 中括号 */
    OP_PARENTHESS /* 小括号 */
} OP_TYPE;

class OpItem {
public:
    OpItem(const char ch);

    OpItem(const std::string &func, const char prefix = 0);

    OpItem(const OpItem &item);

    OpItem();

    virtual ~OpItem();

    OpItem &operator=(const OpItem &item);

    static bool isDigtal(const char *var);

    static bool isKeyWords(const std::string &func);
    static bool isFormatChar(const char c);
    static bool isSupport(const char c, int np);

    /*外 优先级 ,数字优先级设为-1 */
    int priority();

    void show();

    std::string showStr();
    std::string leftStr();
    std::string rightStr();

    union OpData {
        OpData() {}
        ~OpData() {}
        int8_t ch;
        char var[MAX_VAR_LEN];
    };

    OpValue digit;
    OpData op;
    OP_TYPE type;
    int32_t params; /* 参数个数 */

private:
    void release();
    void copyitem(const OpItem &item);

private:
};
} // namespace libxcom
#endif // LIBXCOM_OPITEM_H
